home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga Collections: Purity
/
Purity #31 (1994-06-26)(Diesel)(DE)[WB].zip
/
Purity #31 (1994-06-26)(Diesel)(DE)[WB].adf
/
ForuM
/
OS2KursI.TXT
< prev
next >
Wrap
Text File
|
1994-06-26
|
12KB
|
352 lines
***********************************************************
OS2.0 - Kurs
in KICK-Pascal
by Björn Schotte (BOMBERSOFT)
***********************************************************
Hi Freax !!
Nachdem ich also vor nicht allzu langer Zeit Beispielproggys
zu OS2.0 vorstellte, melde ich mich nun mit einem echten (!!)
Kurs zur OS2.0-Programmierung zurück =;)
TEIL 1: Alles über Screens und Windows
Vorwort: Das sicherlich neue an OS2.0 sind die sog.
TagItems
.
Diese sind wie folgt aufgebaut:
TagItem = RECORD
ti_Tag : LONG;
ta_Data : LONG;
END;
Das Feld ti_Tag nimmt eine beliebige Konstante auf (z.B.
WA_InnerWidth etc.), ti_Data dagegen die "Daten", die ti_Tag
braucht.
Also, als erstes wollen wir mal einen Screen öffnen. Die
Auflösung sollte in HIRES sein und als Breite bzw. Höhe
nehmen wir die Standardmaßen. Dann sieht ein Teil des Proggys
so aus:
ta[1] := TagItem(SA_Width, STDSCREENWIDTH);
ta[2] := TagItem(SA_Height, STDSCREENHEIGHT);
ta[3] := TagItem(SA_DisplayID, HIRES_KEY); { Auflösung }
mit:
ta : ARRAY[1..15] OF TagItem; { großzügig gewählt }
Nun wollen wir noch einen Titel für unseren Screen und die Tiefe
setzen wir mal auf 2 (4 Farben):
{ Definiert man es so, kann man bei bestimmten Tags in
ti_Data einen String einsetzen !! }
ta[4].ti_Tag := SA_Title;
ta[4].ti_Data := "Erstes Beispiel-Programm zur OS2-Programmierung";
ta[5] := TagItem(SA_Depth, 2);
So, nun wollen wir unseren Screen öffnen. Moment mal, wird hier
jemand sagen... Mußten wir nicht unter OS1.x die NewScreen-
Struktur vollkommen ausfüllen, und hier ??
Tja, der Vorteil von OS2.0 ist, daß ich nur die nötigsten Tags
ausfüllen muß bzw. kann, die anderen sind nämlich schon
vordefiniert !!! Also :
{ Die Tag-Liste müssen wir ja noch als "endlich" kennzeichnen: }
ta[6].ti_Tag := TAG_DONE; { oder TAG_END }
sp := OpenScreenTagList(NIL, ^ta);
IF sp = NIL THEN { Fehler }
Der erste Parameter ist ein Zeiger auf eine NewScreen-Struktur,
die dann mit den Tags ergänzt wird. Das brauchen wir aber nicht.
Nun haben wir unseren Screen geöffnet. Weitere Screen-Tags sind:
SA_Left Position des Screens links (Default: 0)
SA_Top Position des Screens rechts (D: 0)
SA_DetailPen Textfarbe des Titels (D: -1)
SA_BlockPen Farbe des Titelbalkens (D: -1)
SA_Font Standard Zeichensatz des Screens (D: System Def.Font)
{ Zeiger auf eine TextAttr-Struktur erwartet:
z.B.: :=TagItem(SA_Font, LONG(^tattr)); }
SA_Type CustomScreen oder WorkbenchScreen (D: CUSTOMSCREEN)
{ CUSTOMSCREEN oder WBENCHSCREEN }
SA_BitMap Zeiger auf eigene BitMap (D: NIL)
SA_ShowTitle Darstellung der Titelzeile bei Backdrop-Windows
(D: LONG(FALSE) )
SA_Behind Screen beim Öffnen nicht nach vorne bringen
(D: LONG(FALSE) )
SA_Quiet Der Screen wird ohne Titelbalken und Gadgets
dargestellt (D: LONG(FALSE) )
SA_Overscan Einen der definierten Overscan-Größen wählen:
OSCAN_TEXT, OSCAN_STANDARD, OSCAN_MAX oder
OSCAN_VIDEO (D: OSCAN_TEXT)
SA_DClip Angezeigter Aussschnitt des Screens
(DisplayClip-Region) { Zeiger auf Rectangle }
(D: NIL)
SA_Autoscroll Sollte der Screen größer sein, als man auf dem
Bildschirm darstellen kann, so wird mit diesem
Boolean-Tag festgelegt, ob das Betriebssystem
den Bildschirm verschieben soll, wenn man mit
dem Mauszeiger über den "Bildschirmrand" fährt.
(D: LONG(FALSE) )
SA_Pens So, jetzt wird`s spannend: Diesen Tag sollte
man immer verwenden. Er legt nämlich fest, mit
welcher Farbe was gezeichnet wird (Gadget-Rand
hell/dunkel etc.). Man legt ein Array mit 9 bzw.
10 Elementen des Typs INTEGER an und legt dann
die Farben fest. Das letzte Element muß dann
auf -1 zeigen. Die Standardeinstellung der
Workbench ist dabei:
3,1,1,2,1,3,1,0,2, -1
DETAILPEN, BLOCKPEN, TEXTPEN, SHINEPEN,
SHADOWPEN, FILLPEN, FILLTEXTPEN,
BACKGROUNDPEN, HIGHLIGHTTEXTPEN
Einfacher ist es, wenn man das erste Element
auf -1 läßt, dann werden die Einstellungen der
Workbench übernommen. (D: nix)
SA_PubName Name des Screens als Public-Screens (D: NIL)
SA_PubTask Dieser Task soll benachrichtigt werden, falls
das letzte Fenster auf dem PublicScreen
geschlossen worden ist. Nur gültig mit SA_PubSig
(D: aufrufender Task)
SA_PubSig Signal, das per AllocSignal angefordert worden
ist. (D: nix)
SA_ErrorCode Zeiger auf eine Variable, in der im "Fehlerfall"
der Fehlercode abgelegt wird:
OSERR_NOMONITOR - angeforderter Monitor nicht vorh.
OSERR_NOCHIPS - benötigte Customchips nicht vorh.
OSERR_NOCHIPMEM - nicht genug CHIP-Memory
OSERR_NOMEM - kein Speicher frei
OSERR_UNKNOWNMODE - DisplayID unbekannt
OSERR_PUBNOTUNIQUE - Name des PublicScreens existiert
schon
Es gibt noch ein paar mehr, die halte ich aber nicht für wichtig,
da sie eh selten gebraucht werden. Also, nun haben wir unseren
Screen geöffnet, jetzt muß nur noch ein Fenster her:
Als erstes mal die Tags:
WA_Left Linke Position (0)
WA_Top Obere Position (0)
WA_Width Breite (ScreenWidth)
WA_InnerWidth Breite des Fensters ohne Rahmen (zu bevorzugen)
WA_Height Höhe (ScreenHeight)
WA_InnerHeight Höhe des Fensters ohne Rahmen (zu bevorzugen)
WA_DetailPen Textfarbe d. Titels (-1)
WA_BlockPen Hintergrundfarbe d. Titels (-1)
WA_IDCMP IDCMP-Flags des Fensters (0)
WA_Flags Flags des Fensters (0)
WA_Gadgets Zeiger auf Gadget-Liste, die ans Fenster
angehängtwerden { p_Gadget } (D: NIL)
WA_CheckMark p_Image : Zeiger auf ein Image, das den Haken
für Menüitems definiert (D: NIL)
WA_Title Unser Titel (D: nix)
WA_CustomScreen Übergeben wird hier unser Screen (nix)
WA_SuperBitMap Zeiger auf SuperBitMap { p_BitMap } (nix)
WA_MinWidth Minimale Breite (D: WA_Width)
WA_MaxWidth Maximale Breite (D: WA_Width)
WA_MinHeight Minimale Höhe (D: WA_Height)
WA_MaxHeight Maximale Höhe (D: WA_Height)
WA_ScreenTitle ScreenTitle bei aktivem Fenster
WA_AutoAdjust (LONG(TRUE) oder LONG(FALSE) ) -> Anpassung
der Fenstergröße an den Screen erlaubt
WA_PubScreenName Name des PublicScreens, auf dem das Fenster
erscheinen soll
WA_PubScreen Zeiger auf PublicScreen, auf dem das Fenster
erscheinen soll (muß mit LockPubScreen
gesichert werden !!)
WA_MouseQueue maximale Anzahl der IDCMP_MOUSEMOVE-Messages,
die von Intuition aneinandergereiht werden
(D: 5)
Also, öffnen wir ein Fenster:
ta[1] := TagItem(WA_IDCMP, IDCMP_CLOSEWINDOW);
ta[2] := TagItem(WA_Flags, WFLG_CLOSEGADGET+WFLG_ACTIVATE);
ta[3] := TagItem(WA_CustomScreen, LONG(sp));
ta[4].ti_Tag := WA_Title;
ta[4].ti_Data := "Hallo";
ta[5] := TagItem(WA_Top, 14);
ta[6] := TagItem(WA_Height, sp^.Height - 14);
ta[7].ti_Tag := TAG_DONE;
wp := OpenWindowTagList(NIL,^ta);
IF wp = NIL THEN { Fehler }
mit:
wp : p_Window;
sp : p_Screen;
Nun warten wir wie üblich mit WaitPort() und GetMsg() und
replyen das ganze dann mit ReplyMsg() und schliessen dann
wie folgt:
CloseWindow(wp);
ok := CloseScreen(sp);
{ TRUE, falls Screen geschlossen werden konnte, andernfalls
FALSE (Fenster noch auf dem Screen !!) }
mit:
ok : BOOLEAN;
OK. Auf zum nächsten...
TEIL 2: DIE GADTOOLS.LIBRARY
Nun haben wir schon Screens und Fenster geöffnet, aber das
alleine sieht noch nicht gut aus. Jetzt wollen wir Gadgets
und Menüs in unserem Fenster installieren:
Also, als erstes brauchen wir die sog.
VisualInfo
.
VisualInfo ?? Richtig gehört: Sie braucht man zum Screen-
spezifischen Zeichnen von Gadgets und Menüs. Und wie bekommen
wir die ?? Ganz einfach, mit der Funktion GetVisualInfoA() aus
der GadTools.library:
{ Am Anfang des Proggys: }
OpenLib(gadtoolsbase,"gadtools.library",36);
vi := GetVisualInfoA(ps, NIL);
mit:
vi : PTR;
ps : p_Screen;
Doch von welchem Screen brauchen wir die ? Vorausgesetzt,
daß wir unser Fenster auf einem eigenen Screen öffnen, setzen
wir unseren Screen-Pointer ein. Sollte unser Fenster auf der
Workbench geöffnet werden, so müssen wir den Workbench-Screen-
Zeiger einsetzen. Wie das geht ? Ganz einfach:
ps := LockPubScreen("Workbench"); { Anstatt "Wor..." auch NIL }
IF ps = NIL THEN { Fehler }
LockPubScreen ?? Tja, diese Funktion ist ähnlich der von LockIBase.
Doch hier wird der Public (öffentliche) Screen gesperrt, so daß
keine Fenster etc. geöffnet werden können bzw. der Screen
geschlossen werden kann, um somit einige Daten zu bekommen. Wie
bei LockIBase müssen wir, wenn wir unsere VisualInfo haben, den
PubScreen wieder entriegeln. Somit sieht das eigentliche Fragment
so aus:
{ Weiter oben Screen öffnen, falls gewünscht }
ps := LockPubScreen(NIL);
IF ps = NIL THEN { Fehler }
vi := GetVisualInfoA(ps, NIL);
UnLockPubScreen(NIL, ps);
IF vi = NIL THEN { Fehler }
So, sollte alles gut laufen, haben wir jetzt unsere VisualInfo.
Nun wollen wir Gadgets in unser Fenster einbauen. Wie unter OS1.x
möglich, kann man entscheiden, ob man direkt beim Öffnen die
Gadgets in die Window-Gadget-List einhängt (WA_Gadgets !!) oder
erst später per AddGList/AddGadget... Ich ziehe den ersteren
Fall vor, allerdings müssen wir dann hier erst die Gadgets
definieren und dann (!) das Fenster öffnen. Wir verwenden aber
zum "Bauen" keine Gadget-Struktur, sondern definieren uns die
NewGadget
-Struktur, die man so definiert:
ng := NewGadget(10,20, { LeftEdge, TopEdge }
200,13, { Breite, Höhe }
"Hallo",^tattr, { GadgetText, TextAttr }
1,PLACETEXT_IN, { GadgetNumber, Flags }
vi,NIL); { VisualInfo, UserData }
Einige Elemente sind sicher schon bekannt (Gadget-Struktur !!).
Also, was wir brauchen, ist die VisualInfo (die holen wir uns
vom PubScreen) und evtl. eine TextAttr-Struktur. Beispiel: Wir
definieren uns ein Gadget, dann sieht unser Programmfragment
so aus:
gl := NIL;
gad := CreateContext(^gl); {
MEGA-WICHTIG !!
}
IF gad=NIL THEN { Fehler }
ng := NewGadget(10,20,
100,13,
"_Start",^tattr, { "_" ?? siehe unten }
1,PLACETEXT_IN,
vi,NIL);
{ "_" ?? : }
t[1] := TagItem(GT_Underscore, LONG("_"));
{ Aha, hier definieren wir das "Erkennungszeichen", welcher
Buchstabe unterstrichen werden soll (in unserem Beispiel
"S") }
gad1 := CreateGadgetA(BUTTON_KIND,gad,^ng,^t);
{ CreateGadgetA(Art_des_Gadgets,Vorgänger_Gadget,
Zeiger_auf_Record,Evtl_Tags); }
IF gad1 = NIL THEN { Fehler }
{ Fenster öffnen; Tag WA_Gadgets:
t[x] := TagItem(WA_Gadgets, LONG(gl)); }
Alles klar ??
Es gibt noch viele weitere Gadgets als nur Button-Gadgets:
Stringgadget
:
Wie unter OS1.x ein Gadget, in dem man etwas eingeben kann.
Integergadget
:
Hier kann man nur Zahlen eingeben. Ausgelesen wird dies über
die StringInfo des Gadgets !!
CheckBox
:
Die Dinger mit dem Haken.
RadioButton
:
Kleine quadratische Felder, ähnlich CheckBox, nur daß hier
bei aktiviertem Zustand der Inhalt ausgefüllt wird.
Tja, es gibt noch einige mehr, aber es ist jetzt 21:01, und ich
will mich jetzt mal ranmachen und SeaQuest gucken, außerdem muß
die Disk jetzt endgültig an Diesel ....
Ich hoffe, ich habe nichts falsches geschrieben. Sollte irgend
jemand Fehler entdecken oder noch weitere Vorschläge haben, dann
soll er mir schreiben:
Björn Schotte
Am Burkardstuhl 45
97267 Himmelstadt
P.S.: Freut Euch, FreaX, bald gibt es den 2. Teil der OS2.x-
Programmierung, u.a. mit der Fortsetzung der GadTools-Library,
ASL-Library und abschliessende Tips...